package com.example.securitydemo.init;

import com.example.securitydemo.Dao.UserDao;
import com.example.securitydemo.entity.UserInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;

@Component
public class JdbcInit {

    @Autowired
    private UserDao dao;
    //@PostConstruct
    public void init(){
        //加密密码
        PasswordEncoder encoder = new BCryptPasswordEncoder();
        UserInfo u = new UserInfo();
        u.setPassword(encoder.encode("1223456"));
        u.setUsername("zs");
        u.setRole("normal");
        dao.save(u);

        u = new UserInfo();
        u.setPassword(encoder.encode("admin"));
        u.setUsername("ls");
        u.setRole("admin");
        dao.save(u);

    }
}
/**
 * 被@PostConstruct修饰的方法会在服务器加载Servlet的时候运行，并且只会被服务器调用一次，类似于Serclet的init()方法。被@PostConstruct修饰的方法会在构造函数之后，init()方法之前运行。
 *
 * 被@PreDestroy修饰的方法会在服务器卸载Servlet的时候运行，并且只会被服务器调用一次，类似于Servlet的destroy()方法。被@PreDestroy修饰的方法会在destroy()方法之后运行，在Servlet被彻底卸载之前。
 *
 * 服务器加载Servlet过程：
 *
 *
 *
 * 另外，spring中Constructor、@Autowired、@PostConstruct的顺序：
 *
 * 其实从依赖注入的字面意思就可以知道，要将对象B注入到对象A，那么首先就必须得生成对象A和对象B，才能执行注入。所以，如果一个类A中有个成员变量b被@Autowried注解，那么@Autowired注入是发生在A的构造方法执行完之后的。
 *
 * 如果想在生成对象时完成某些初始化操作，而偏偏这些初始化操作又依赖于依赖注入，那么久无法在构造函数中实现。为此，可以使用@PostConstruct注解一个方法来完成初始化，@PostConstruct注解的方法将会在依赖注入完成后被自动调用。
 *
 * Constructor >> @Autowired >> @PostConstruct
 */